package com.snail.auth;

/**
 * @autor houyanfeng 2021/3/4
 */

import com.common.util.DateUtil;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

public class JwtTokenUtil {

    static { // 将证书文件里边的私钥公钥拿出来
        try {
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成token
     *
     * @param subject   主体信息
     * @param validTime 过期时间（秒）
     * @param dataMap   自定义数据信息
     * @return token字符串
     */
    public static String generateToken(String subject, int validTime, Map<String, Object> dataMap, String salt) {
        JwtBuilder builder = Jwts.builder().setSubject(subject).setIssuer("tj-cvs")//issuer 该JWT的签发者，是否使用是可选的
                .signWith(SignatureAlgorithm.HS512, salt) // 不使用公钥私钥
                .setExpiration(new Date(System.currentTimeMillis() + validTime * 24 * 3600 * 1000));
        for (Map.Entry<String, Object> map : dataMap.entrySet()) {
            builder.claim(map.getKey(), map.getValue());
        }
        return builder.compact();
    }

    /**
     * 解析token,获得subject中的信息
     */
    public static String parseToken(String token, String salt) {
        return getTokenClaim(token, salt).getSubject();
    }

    /**
     * 是否已过期
     *
     * @param expirationTime yyyy-MM-dd HH:mm:ss
     * @return boolean
     */
    public static boolean isExpiration(String expirationTime) {
        //通过redis中的失效时间进行判断
        String currentTime = DateUtil.getTime();
        if (DateUtil.compareDate(currentTime, expirationTime)) {
            //当前时间比过期时间小，失效
            return true;
        } else {
            return false;
        }
    }

    /**
     * 与当前时间比是否过期
     *
     * @param expirationTime yyyy-MM-dd HH:mm:ss
     */
    public static boolean isOverdue(String expirationTime) {
        try {
            Date exTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(expirationTime);
            return new Date().after(exTime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return false;
    }

    public static Claims getTokenClaim(String token, String salt) {
        return Jwts.parser().setSigningKey(salt).parseClaimsJws(token).getBody();
    }

    public static void main(String[] args) {
//        String salt = "_secret";
//        Map claims = new HashMap();
//        claims.put("pwd", "123");
//        String token = generateToken("admin", 120, claims, salt);
//        System.out.println(token);
//        // 验证
//        String subject = parseToken(token, salt);
//        System.out.println("subject:" + subject);
//        System.out.println(JSONUtils.toJSONString(getTokenClaim(token,salt)));

    }
}
